package dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;

import entities.Apartamento;
import entities.Contrato;
import exceptions.CampoVazioException;
import exceptions.MensalidadeExistenteException;
import exceptions.TamanhoInvalidoException;
import exceptions.ValorMonetarioInvalidoException;

public interface ApartamentoDAO {

	public void cadastrarApartamento(String numero, String bloco, String valor, Connection connection) throws CampoVazioException,
	SQLException, ValorMonetarioInvalidoException, TamanhoInvalidoException;

	public void atualizaValorApto(String numero, String bloco, String valor, Connection connection) throws CampoVazioException,
	SQLException, ValorMonetarioInvalidoException;

	public HashMap<String, Apartamento> recuperaAptos(boolean vago, Connection connection)throws ParseException, SQLException;

	public ArrayList<String> listarApartamentosVagos(Connection connection) throws SQLException;

	public ArrayList<String> listarApartamentos(Connection connection) throws SQLException;

	public ArrayList<String> listarApartamentosAlugados(Connection connection) throws SQLException;

	public void atualizaApartamento(Apartamento apto, Connection connection) throws SQLException, ParseException;

	public void cadastrarMoradorEmApto(String cpfMorador, String numero, String bloco, Connection connection) throws SQLException;

	public boolean ultimoMesDoContrato(String numero, String bloco, String dataVencimento, Connection connection) throws SQLException, ParseException;

	public int recuperaQntDiasPagar(String numero, String bloco,
			Connection connection)  throws SQLException;

	public void cadastraMensalidade(Apartamento apto, Date dataVencimento, boolean isAluguel,
			boolean ativo, boolean mensalidadeExtra, boolean primeiroMes, Connection connection) throws SQLException, ParseException, MensalidadeExistenteException;

	public ResultSet recuperaDatasDePagamento(Apartamento apto, boolean isAluguel, Connection connection)  throws SQLException;

	public void atualizarMensalidade(Apartamento apto, String dataVencimento, boolean isAluguel,
			Connection connection) throws SQLException, ParseException;

	public ResultSet recuperaContratosAFinalizar(int mesInicial, int mesFinal, int ano, Connection connection)  throws SQLException;

	/**
	 * @return
	 */
	public boolean possuiMensalidadesAtivas(Apartamento apto, boolean isAluguel, Connection connection) throws SQLException;

	public void removerMensalidades(Apartamento apto, Connection connection) throws SQLException;

	public void removerMensCondominio(Apartamento apto, Date dataVencimento, boolean isAluguel,
			boolean ativo, boolean mensalidadeExtra, Connection connection) throws SQLException, ParseException;

	public void removerMoradoresApto(Apartamento apto, Connection connection)  throws SQLException;

	public void removerMoradorDeApto(String cpf, Apartamento ap, Connection connection) throws SQLException;

	public void cadastraMensalidadeExtra(Apartamento apartamento,
			Date stringAsSimpleDate, boolean isAluguel, boolean isAtivo,double valor, Connection connection) throws SQLException, MensalidadeExistenteException;

	public boolean isPrimeiraMensalidade(Apartamento apto, Date dataVencimento, Connection connection) throws SQLException;

	public boolean existeMensalidadeComDataMaior(Apartamento apto, Date dataVencimento,
			boolean isAluguel, boolean ativo, Connection connection) throws SQLException;

	public void atualizarMensalidades(Apartamento aptoNew, Apartamento aptoOld,
			Contrato contrato, String diaVenc, boolean ehAluguel, Connection connection) throws SQLException;
}
